#ifndef _DRV_NEUL_DA_H
#define _DRV_NEUL_DA_H

#include <Includes.h>
#include <DRV_EC600S.h>

//历史原因参数KEY仍然与NB原先一直,不再另外定义
#define APS_PARA_MODULE_APS_DA APS_PARA_MODULE_APS_NB
#define NBCONFIG_ID      0
#define DISCRETEWIN_ID   1

#pragma pack(1)

#define DIS_DEFAULT_WINDOWS    0/*1800*/
#define DIS_DEFAULT_INTERVAL      10
#define DIS_WINDOW_MAX_SECOND       (3600)
#define DIS_INTRVL_SECOND           (2)

typedef struct{
	T_MUTEX mutex;
	U32 udwDiscreteWin;
	U32 udwDiscreteInterval;
}ST_DISCRETE_PARA;

typedef struct{
	U32 udwDiscreteWin;
	U32 udwDiscreteInterval;
}ST_DISCRETE_SAVE_PARA;

#define DIS_ENABLE      0x01
#define DIS_ENABLE_H    0x00
#define DIS_ENABLE_L    0x00
#define DIS_DISABLE     0x00
#define DIS_DISABLE_H   0xAABBCCDD
#define DIS_DISABLE_L   0x11223344

typedef struct{
	T_MUTEX mutex;
	U32 enableH;
	U32 enableL;
}ST_DISCRETE_ENABLE;

typedef struct{
	T_MUTEX mutex;
	U32 startTick;
	U32 endTick;
	U32 eplaseTick;
}ST_ATTACH_TIME;

typedef struct
{
    EN_DEV_TYPE dev_type;
    void (*pfunc)();   //离散附着控制函数
}ST_DA_DEV;

#pragma pack()

/**
@brief 离散参数写入flash
@param pstDisSavePara 离散参数
@return 0成功,非0失败
**/
U32 DASetDiscreteParaToFlash(ST_DISCRETE_SAVE_PARA *pstDisSavePara);
/**
@brief 从flash获取离散参数
@param pstDisSavePara 离散参数
@return 0成功,非0失败
**/
U32 DAGetDiscreteParaFromFlash(ST_DISCRETE_SAVE_PARA *pstDisSavePara);
/**
@brief 离散参数恢复默认值
@param
@return 0成功,非0失败
**/
int DAFactoryReset();
/**
@brief 设置缓存中离散参数
@param pstDisSavePara 离散参数
@return 0成功,非0失败
**/
U32 DASetDiscretePara(ST_DISCRETE_SAVE_PARA *pstDisSavePara);
/**
@brief 获取缓存中离散参数
@param pstDisSavePara 离散参数
@return 0成功,非0失败
**/
U32 DAGetDiscretePara(ST_DISCRETE_SAVE_PARA *pstDisSavePara);
/**
@brief 设置离散窗口
@param disWin 离散窗口
@return 0成功,非0失败
**/
U32 DASetDiscreteWindow(U32 disWin);
/**
@brief 获取离散窗口
@param
@return 离散窗口
**/
U32 DAGetDiscreteWindow(void);
/**
@brief 获取离散间隔
@param
@return 离散间隔
**/
U32 DAGetDiscreteScale(void);
/**
@brief 设置离散开启或关闭
@param
@return 0成功，非0失败
**/
U32 DASetDisEnable(U32 enable);
/**
@brief 设置离散开启或关闭,不带信号量操作
@param
@return 0成功，非0失败
**/
U32 DASetDisEnableWithoutMutex(U32 enable);
/**
@brief 获取离散开启或关闭状态
@param
@return 离散开关状态
**/
U32 DAGetDisEnable(void);
/******************************************************************************
Function    : OppGetNBConOffset
Description : 获取网络附着的偏移时间
Note        : (none)
Input Para  : @disPeriodWnd  离散的时间窗口 单位 秒
               @disIntvlInSnd 离散点的间隔时间 单位 秒
               @mac1    mac地址右第二字节 f9 (24:0a:c4:28:f9:6c)
               @mac0    mac地址右第一字节 6c (24:0a:c4:28:f9:6c)
 Output Para : @outDisOffset
                                      根据输入参数算出的离散偏移时间 单位秒
Return      : OPP_SUCCESS 成功
                             OPP_FAIL   参数错误等
******************************************************************************/
U8 OppGetDisOffsetSecond(U32 disPeriodWnd, U32 disIntvl, U8 mac1,U8 mac0,U32* outDisOffset);
/**
@brief 获取离散时间,单位s
@param
@return 离散时间
**/
U32 DADisOffsetSecondGet(void);
/**
@brief 设置离散开始时间,单位ms
@param
@return
**/
int DASetAttachStartTime(void);
/**
@brief 设置离散结束时间,单位ms
@param
@return
**/
int DASetAttachEndTime(void);
/**
@brief 附着耗时,单位ms
@param
@return
**/
U32 DAGetAttachEplaseTime(void);
/**
@brief 获取相对离散偏移tick值,单位ms
@param
@return
**/
U32 DAAttachDisTick(void);
/**
@brief 离散附着管理初始化
@param
@return
**/
int DAInit();
/**
@brief 离散附着管理主任务
@param
@return
**/
int DALoop();

/*定义别名，兼容老BC28函数*/
U32 NeulBc28SetDiscreteParaToFlash(ST_DISCRETE_SAVE_PARA *pstDisSavePara);
U32 NeulBc28GetDiscreteParaFromFlash(ST_DISCRETE_SAVE_PARA *pstDisSavePara);
U32 NeulBc28SetDiscretePara(ST_DISCRETE_SAVE_PARA *pstDisSavePara);
U32 NeulBc28GetDiscretePara(ST_DISCRETE_SAVE_PARA *pstDisSavePara);
U32 NeulBc28SetDiscreteWindow(U32 disWin);
U32 NeulBc28GetDiscreteWindow(void);
U32 NeulBc28GetDiscreteScale(void);
U32 NeulBc28SetDisEnable(U32 enable);
U32 NeulBc28SetDisEnableWithoutMutex(U32 enable);
U32 NeulBc28GetDisEnable(void);
U32 NeulBc28DisOffsetSecondGet(void);
int NeulBc28SetAttachStartTime(void);
int NeulBc28SetAttachEndTime(void);
U32 NeulBc28GetAttachEplaseTime(void);
U32 NeulBc28AttachDisTick(void);

#endif

